package com.tbit.uqbike.client.service;

import com.tbit.uqbike.client.pojo.Recharge;
import com.tbit.uqbike.client.pojo.User;
import com.tbit.uqbike.client.pojo.WeixinPayConfig;
import com.tbit.uqbike.client.pojo.WeixinPayParam;

import java.util.Map;

/**
 * 微信支付service
 *
 * @author Leon
 * 2017年2月24日 下午4:09:17
 */
public interface WeixinPayService {

    /**
     * 添加_微信
     *
     * @param
     */
    String getOrder_weixin(String code, Integer accountId, Integer userId, Double money,
                           String remark, Boolean deposit, Integer adAccountId, Integer rechargeType);

    /**
     * 添加_APP
     *
     * @param
     */
    WeixinPayParam getOrder_app(Integer accountId, Integer userId, Double money, String remark,
                                Boolean deposit, Integer adAccountId, Integer rechargeType);

    /**
     * 免押会员小程序微信支付
     *
     * @param code
     * @param
     * @param user
     * @param memberFeeId
     * @return
     */
    String getMemberOrder_weixin(String code, User user, Integer memberFeeId, Integer adAccountId);

    /**
     * 免押会员APP微信支付
     *
     * @param
     * @param user
     * @param memberFeeId
     * @return
     */
    WeixinPayParam getMemberOrder_app(User user, Integer memberFeeId, Integer adAccountId);

    /**
     * 骑行会员小程序支付
     *
     * @param code
     * @param
     * @param rideCardId
     * @return
     */
    String getRideCardOrder_weixin(String code, User user, Integer rideCardId, Integer adAccountId);

    /**
     * 骑行会员APP支付
     *
     * @param
     * @param
     * @param rideCardId
     * @return
     */
    WeixinPayParam getRideCardOrder_app(User user, Integer rideCardId, Integer adAccountId);

    /**
     * 会员卡小程序微信支付
     *
     * @param code
     * @param
     * @param user
     * @param vipId
     * @return
     */
    String getVipOrder_weixin(String code, User user, Integer vipId, Integer adAccountId);

    /**
     * 会员卡APP微信支付
     *
     * @param
     * @param user
     * @param vipId
     * @return
     */
    WeixinPayParam getVipOrder_app(User user, Integer vipId, Integer adAccountId);

    /**
     * 支付逻辑处理
     *
     * @param recharge
     * @param out_trade_no
     * @param transaction_id
     */
    void pay(Recharge recharge, String out_trade_no, String transaction_id, String dateTime, String fee);

    /**
     * 免押会员金额
     *
     * @param type
     * @param user
     * @param accountId
     * @param orderNO
     * @param memberFeeId
     * @return
     */
    Double getMemberOrder_base(Integer type, User user, Integer accountId, String orderNO,
                               Integer memberFeeId);

    /**
     * 获取骑行卡金额
     *
     * @param type
     * @param user
     * @param rideCardId
     * @param orderNO
     * @param adAccountId
     * @return
     */
    Double getRideCardOrder_base(Integer type, User user, Integer rideCardId, String orderNO,
                                 Integer adAccountId);

    /**
     * 获取vip会员卡金额
     *
     * @param type
     * @param user
     * @param vipId
     * @param orderNO
     * @param adAccountId
     * @return
     */
    Double getVipOrder_base(Integer type, User user, Integer vipId, String orderNO,
                            Integer adAccountId);

    /**
     * 押金充值基础校验
     *
     * @param userId
     * @param money
     * @param remark
     * @param deposit
     * @param orderNO
     * @param adAccountId
     * @param type
     * @param rechargeType
     * @return
     */
    Double order_base(Integer userId, Double money, String remark, Boolean deposit, String orderNO,
                      Integer adAccountId, Integer type, Integer rechargeType);

    /**
     * 优惠券套餐小程序微信支付
     *
     * @param code
     * @param
     * @param user
     * @param mealId
     * @return
     */
    String getMeal_weixin(String code, User user, Integer mealId, Integer adAccountId);

    /**
     * 优惠券套餐APP微信支付
     *
     * @param
     * @param user
     * @param mealId
     * @return
     */
    WeixinPayParam getMeal_app(User user, Integer mealId, Integer adAccountId);

    /**
     * 获取vip会员卡金额
     *
     * @param type
     * @param user
     * @param mealId
     * @param orderNO
     * @param adAccountId
     * @return
     */
    Double getMeal_base(Integer type, User user, Integer mealId, String orderNO, Integer adAccountId);

    /**
     * 获取小程序accesstoken
     *
     * @param weixinPayConfig
     * @return
     */
    String getAccessToken(WeixinPayConfig weixinPayConfig);

    /**
     * 校验是否需要购买
     *
     * @param user
     * @param adAccountId
     */
    void checkIsByMem(User user, Integer adAccountId);

    /**
     * 校验微信支付条件
     *
     * @param accountId
     * @param type
     * @param code
     * @return
     */
    WeixinPayConfig checkWxPay(Integer accountId, Integer type, String code);

    /**
     * 微信推送通知
     *
     * @param accountId 区域id
     * @param userId    用户id
     * @param map       附加参数
     * @param type      模板类型
     * @param cardType  优惠卡类型
     */
    void sendLockMsg(Integer accountId, Integer userId, Map<String, String> map, Integer type,
                     Integer cardType);

    /**
     * 获取小程序推广码
     *
     * @param accountId 品牌id
     * @param type      类型
     * @return
     */
    String getUrlScheme(Integer accountId, Integer type);

    /**
     * 发送创建订单消息至mq,进行异步查询订单交易状态
     *
     * @param orderNO 订单编号
     * @param type    类型 0支付,1退款
     * @param payApiType @see com.tbit.uqbike.client.pojo.PayApiType
     */
    void sendPayMsg(String orderNO, Integer type, String payApiType);

    /**
     * 退款回调逻辑
     *
     * @param orderNO  充值订单号
     * @param refundNO 退款订单号
     * @param state    状态
     * @param datetime 退款时间
     */
    void refundCallback(String orderNO, String refundNO, String state, String datetime);

    void refundCallbackTest(String orderNO, String refundNO, String state, String datetime, Double totalRefundMoney, Double refundMoney, String transactionId) throws Exception;

    /**
     * 添加资金变动记录
     *
     * @param user
     * @param recharge
     * @param capitalType
     * @param businessType
     * @param dateTime
     * @param details
     * @param remark
     * @param originalAccountId
     * @param changeStartMoney
     * @param changeEndMoney
     */
    void addUserCapitalChange(User user, Recharge recharge, Integer capitalType, Integer businessType,
                              String dateTime, String details, String remark, Integer originalAccountId, Long changeStartMoney
            , Long changeMoney, Long changeEndMoney, Integer type);

    /**
     *
     * @param user 用户信息
     * @param recharge 充值订单信息
     * @param businessNO 业务单号
     * @param dateTime 时间
     * @param payPlatform 平台
     * @param transactionType 类型
     */
    void addTransationLog(User user, Recharge recharge, String businessNO, String dateTime, Integer payPlatform, Integer transactionType,String remark);
    /**
     * 添加余额变动
     *
     * @param user
     * @param recharge
     * @param dateTime
     * @param capitalType
     * @param businessType
     * @param startMoney
     * @param changeMoney
     * @param remark
     */
    void addBalanceChange(User user, Recharge recharge, String dateTime, Integer capitalType, Integer businessType
            , Long startMoney, Long changeMoney, Long changeEndMoney, String remark, Integer type);
}  